280. Promtail 規則順序

WHY

全面使用istio的時候,
要將網路入口的log統一丟去loki管理,
篩選時碰到GPT的幻覺,
最後丟了測試結果,才更正過來。
Gemini 倒是一開始就給正確的答案。

Note

本來只有打算抓istio-system的log紀錄,
但翻了一下,每個pod底下的istio-proxy那些log,
對於日後判斷感覺也頗重要,就通通一起留著吧。

所以這次的目標是,抓取 namespace (istio-system)的所有log
以及 namesapce(default)底下的istio-proxy的container log。

只保留 ns 為 istio-system的話,沒什麼爭議。

relabel_configs:
  # Rule 1: 保留 namespace 是 istio-system 
  - source_labels: [__meta_kubernetes_namespace]
    regex: istio-system
    action: keep

也可以在上面使用這段。

scrape_configs:
- job_name: pod-logs
  kubernetes_sd_configs:
    - role: pod
      namespaces:
        names:
          - istio-system

但當有兩個keep時,
就產生混亂了。

以下是錯誤的,當兩個一起掛上去,不會有任何log匯出到loki

GPT一直說,兩個keep規則,只要一個符合就好,
彼此的關聯是 OR

280-fig.1.png
280-fig.2.png

但實際上,

所有規則是依序由上而下套用,目標只有在通過所有 keep規則後,最終才會保留。

要完成or的選項,最好就是寫在同一條。

- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_container_name]
  separator: ";"
  regex: (istio-system;.+)|(default;istio-proxy)
  action: keep

Gemini 則有提供另一個思路,
加上一個虛擬的label ,設定為true,之後再將非true的drop。

relabel_configs:
  # Rule 1: 如果 namespace 是 istio-system,給目標打上一個暫時標記 __temp_keep
  - source_labels: [__meta_kubernetes_namespace]
    regex: istio-system
    action: replace  # 使用 replace action 來添加/修改 label
    target_label: __temp_keep # 設置一個暫時的 label 名稱
    replacement: "true"      # 給這個 label 一個值

  # Rule 2: 如果 namespace 是 default 且 container 是 istio-proxy,也給目標打上同一個暫時標記 __temp_keep
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_container_name]
    regex: default;istio-proxy
    action: replace
    target_label: __temp_keep
    replacement: "true"

  # Rule 3: 最後,只保留帶有 __temp_keep 標記的目標,丟棄沒有此標記的
  - source_labels: [__temp_keep]
    regex: "true" # regex 匹配 __temp_keep 的值
    action: keep  # 只保留匹配的目標 (即帶有 __temp_keep=true 的)

  # (Optional) 清理暫時 label,如果不需要它傳到 Loki
  - source_labels: [__temp_keep]
    action: labeldrop
    regex: __temp_keep